package com.diudiutechnology.www.yadiudiu.util.view;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.diudiutechnology.www.yadiudiu.R;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by Administrator on 2017/8/31.
 * 倒计时
 */

public class GoodsDetailTimerView extends LinearLayout {

    // 天数，十位
    private TextView tv_days_decade;
    // 天数，个位
    private TextView tv_days_unit;
    // 小时，十位
    private TextView tv_hour_decade;
    // 小时，个位
    private TextView tv_hour_unit;
    // 分钟，十位
    private TextView tv_min_decade;
    // 分钟，个位
    private TextView tv_min_unit;
    // 秒，十位
    private TextView tv_sec_decade;
    // 秒，个位
    private TextView tv_sec_unit;

    //布局：时 ，分，秒
    private LinearLayout layHour, layMin, layS, layDays;

    private Context context;

    private int day;
    private int days_decade;
    private int days_unit;
    private int hour_decade;
    private int hour_unit;
    private int min_decade;
    private int min_unit;
    private int sec_decade;
    private int sec_unit;
    // 计时器
    private Timer timer;

    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {
            countDown();
        }
    };

    // 回调接口
    public interface OnTimeOutCallBack {
        void onCallBack();
    }

    private OnTimeOutCallBack callBack;

    public GoodsDetailTimerView(Context context, AttributeSet attrs) {
        super(context, attrs);

        this.context = context;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.view_goodsdetailtimer, this);

        tv_days_decade = (TextView) view.findViewById(R.id.tv_days_decade);
        tv_days_unit = (TextView) view.findViewById(R.id.tv_days_unit);
        tv_hour_decade = (TextView) view.findViewById(R.id.tv_hour_decade);
        tv_hour_unit = (TextView) view.findViewById(R.id.tv_hour_unit);
        tv_min_decade = (TextView) view.findViewById(R.id.tv_min_decade);
        tv_min_unit = (TextView) view.findViewById(R.id.tv_min_unit);
        tv_sec_decade = (TextView) view.findViewById(R.id.tv_sec_decade);
        tv_sec_unit = (TextView) view.findViewById(R.id.tv_sec_unit);

        layDays = (LinearLayout) view.findViewById(R.id.lay_days);
        layHour = (LinearLayout) view.findViewById(R.id.lay_hour);
        layMin = (LinearLayout) view.findViewById(R.id.lay_min);
        layS = (LinearLayout) view.findViewById(R.id.lay_s);
    }



    public void setOnTimeOutCallBack(OnTimeOutCallBack callBack) {
        this.callBack = callBack;
    }

    /**
     * @param
     * @return void
     * @throws
     * @Description: 开始计时
     */
    public void start() {

        if (timer == null) {
            timer = new Timer();
            timer.schedule(new TimerTask() {

                @Override
                public void run() {
                    handler.sendEmptyMessage(0);
                }
            }, 0, 1000);
        }
    }

    /**
     * @param
     * @return void
     * @throws
     * @Description: 停止计时
     */
    public void stop() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    /**
     * @param
     * @return void
     * @throws Exception
     * @throws
     * @Description: 设置倒计时的时长
     */
    public void setTime(int day, int hour, int min, int sec) {
        try {
            System.out.println("daydaydaydayday="+day);
            if (hour >= 24 || min >= 60 || sec >= 60 || hour < 0 || min < 0 || sec < 0) {
                throw new RuntimeException("Time format is error,please check out your code");
            }
            this.day = day;
            days_decade = day / 10;
            days_unit = day - days_decade * 10;
            hour_decade = (hour) / 10;
            hour_unit = (hour) - hour_decade * 10;
            min_decade = min / 10;
            min_unit = min - min_decade * 10;
            sec_decade = sec / 10;
            sec_unit = sec - sec_decade * 10;

            tv_days_decade.setText(days_decade + "");
            tv_days_unit.setText(days_unit + "");
            tv_hour_decade.setText(hour_decade + "");
            tv_hour_unit.setText(hour_unit + "");
            tv_min_decade.setText(min_decade + "");
            tv_min_unit.setText(min_unit + "");
            tv_sec_decade.setText(sec_decade + "");
            tv_sec_unit.setText(sec_unit + "");

            if (day <= 0) {
                layDays.setVisibility(GONE);
            } else {
                layDays.setVisibility(VISIBLE);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 倒计时
     */
    private void countDown() {
        if (isCarry4Unit(tv_sec_unit)) {
            if (isCarry4Decade(tv_sec_decade)) {
                if (isCarry4Unit(tv_min_unit)) {
                    if (isCarry4Decade(tv_min_decade)) {
                        if (isHourUnit(tv_hour_unit)) {
                            if (isHourDecade(tv_hour_decade)) {
                                if (isDayUnit(tv_days_unit)) {
                                    if (isDayDecade(tv_days_decade)) {
                                        if (callBack != null) {
                                            callBack.onCallBack();
                                        }
                                        System.out.println("时间到了");
                                        stop();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 天数变化十位，并判断是否需要进位
     */
    private boolean isDayDecade(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 9;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 天数变化个位，并判断是否需要进位
     */
    private boolean isDayUnit(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 9;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 小时变化十位，并判断是否需要进位
     */
    private boolean isHourDecade(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 2;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 小时变化个位，并判断是否需要进位
     */
    private boolean isHourUnit(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 3;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 分钟、秒钟变化十位，并判断是否需要进位
     */
    private boolean isCarry4Decade(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 5;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }

    /**
     * @param
     * @return boolean
     * @throws
     * @Description: 分钟、秒钟变化个位，并判断是否需要进位
     */
    private boolean isCarry4Unit(TextView tv) {

        int time = Integer.valueOf(tv.getText().toString());
        time = time - 1;
        if (time < 0) {
            time = 9;
            tv.setText(time + "");
            return true;
        } else {
            tv.setText(time + "");
            return false;
        }

    }
}
